#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QPlainTextEdit>
#include <QPushButton>
#include <QThread>
#include <QMetaObject>
#include <QTime>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE


// 工作线程类
class WorkerThread : public QThread {
    Q_OBJECT
public:
    explicit WorkerThread(QObject *parent = nullptr)
        : QThread(parent) {}

    void run() override {
        for(int i = 0; i < 5; ++i) {
            // 模拟耗时操作
            sleep(1);

            // 生成要显示的日志信息
            QString log = QString("Thread update %1").arg(i);

            // 安全调用主线程UI更新
            QMetaObject::invokeMethod(
                parent(),               // 主线程对象
                "appendLog",            // 方法名
                Qt::QueuedConnection,   // 队列连接方式
                Q_ARG(QString, log)     // 参数传递
            );
        }
    }
};

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

public slots:
    // 必须声明为槽函数或使用Q_INVOKABLE
    void appendLog(const QString &text) {
        textEdit->appendPlainText(QString("[%1] %2")
            .arg(QTime::currentTime().toString("hh:mm:ss"), text));
    }

private:
    Ui::MainWindow *ui;

    QPlainTextEdit *textEdit;
    QPushButton *btnStart;
    WorkerThread *worker;

    void setupUI();

protected:
    void closeEvent(QCloseEvent *event) override {
        if(worker && worker->isRunning()) {
            worker->quit();
            worker->wait(1000);
        }
        QMainWindow::closeEvent(event);
    }

};
#endif // MAINWINDOW_H
